﻿/*   
    Copyright (C) 2009 Galaktika Corporation ZAO

    This file is a part of Galaktika.BusinessMonitor
 
    Galaktika.BusinessMonitor is a free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
      
    You should have received a copy of the GNU General Public License
    along with Galaktika.BusinessMonitor.  If not, see <http://www.gnu.org/licenses/>.
  
    If GPL v.3 is not suitable for your products or company,
    Galaktika Corp provides Galaktika.BusinessMonitor under a flexible commercial license
    designed to meet your specific usage and distribution requirements.
    If you have already obtained a commercial license from Galaktika Corp,
    you can use this file under those license terms.
*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Galaktika.BI.Charting;
using Galaktika.BI.Runtime.Services;
using Galaktika.BI.Silverlight.Intermediate;
using Galaktika.BI.Silverlight.Services;
using Galaktika.BI.Extensibility;
using Galaktika.BI.Extensibility.ComponentModel;

namespace Galaktika.BI.Silverlight.Controls
{
    public partial class DataNavigator : UserControl, IBindableObject, IEditableObject
    {
        public DataNavigator()
        {
            InitializeComponent();
        }
        private IBindingManager m_Manager;

        //private object m_DataSource;
        public object ADataSource
        {
            get; set;
        }

        public Orientation AOrientation
        {
            get
            {
                return trackBar.Orientation;
            }
            set
            {
                trackBar.Orientation = value;
            }
        }


        [Browsable(false)]
        public Color ABackColor
        {
            get; set;
        }

        [Browsable(false)]
        public Color ABackColor2
        {
            get; set;
        }

        [Browsable(false)]
        public BorderStyles ABorderStyle
        {
            get; set;
        }

        [Browsable(false)]
        public string ASkinName
        {
            get; set;
        }

        [Browsable(false)]
        public LookAndFeelStyle AStyle
        {
            get; set;
        }

        //private bool showToolTips = true;
        [Browsable(false)]
        public bool AShowToolTips
        {
            get; set;
        }

        [Browsable(false)]
        public string AToolTipText
        {
            get; set;
        }

        [Browsable(false)]
        public Cursor ACursor
        {
            get; set;
        }

        #region IBindableObject Members

        private IBindingContext m_Context;
        public IBindingContext Context
        {
            get
            {
                return m_Context;
            }
            set
            {
                m_Context = value;
            }
        }

        private Dictionary<string, IBindingManager> m_Bindings;
        public IDictionary<string, IBindingManager> Bindings
        {
            get
            {
                if (m_Bindings == null)
                {
                    m_Bindings = new Dictionary<string, IBindingManager>();
                }

                return m_Bindings;
            }
        }

        #endregion

        #region IEditableObject Members

        public void BeginEdit()
        {         
        }

        public void CancelEdit()
        {           
        }

        public void EndEdit()
        {
            if (m_Manager == null)
            {
                m_Manager = m_Bindings["ADataSource"];
            }
            if (m_Manager != null)
            {
                trackBar.Maximum = m_Manager.Count - 1;
                trackBar.Value = m_Manager.Position[0];
            }

            IUserTaskManager taskMgr = (IUserTaskManager)this.Context.Services.GetService(typeof(IUserTaskManager));
            IExecutionContext exe = (IExecutionContext)this.Context.Services.GetService(typeof(IExecutionContext));
            if (exe != null && taskMgr != null)
            {
                if ((this.AShowToolTips && ScriptEngine.ContainsExpression(this.AToolTipText)))
                {
                    taskMgr.RunTaskAsync(
                    string.Format(Localization.AppTask_ProcessingProperties, base.Name),
                    state =>
                    {
                        string tooltip = exe.Parse(this.Context, this.AToolTipText);
                        taskMgr.Dispatcher.BeginInvoke(() =>
                        {
                            if (this.AShowToolTips && !string.IsNullOrEmpty(tooltip))
                            {
                                ToolTipService.SetToolTip(this, new StyledToolTip() { Content = tooltip });
                            }
                        });
                    });
                }
                else
                {                    
                    if (this.AShowToolTips && !string.IsNullOrEmpty(this.AToolTipText))
                    {
                        ToolTipService.SetToolTip(this, new StyledToolTip() { Content = this.AToolTipText });
                    }
                }
            }
                       
            if (this.ABackColor != DefaultColors.Empty)
            {
                if (this.ABackColor2 != DefaultColors.Empty)
                {
                    GradientStopCollection coll = new GradientStopCollection();
                    coll.Add(new GradientStop() { Color = this.ABackColor });
                    coll.Add(new GradientStop() { Color = this.ABackColor2 });
                    base.Background = new LinearGradientBrush(coll, 45.0);
                }
                else
                {
                    base.Background = new SolidColorBrush(this.ABackColor);
                }
            }
            switch (this.ABorderStyle)
            {
                case BorderStyles.HotFlat:
                case BorderStyles.Flat:
                case BorderStyles.NoBorder:
                    base.BorderThickness = new Thickness(0.0);
                    break;
                default:
                    break;

            }                                   
        }

        #endregion

        private void trackBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {            
            if (m_Manager != null)
            {
                m_Manager.Position = new int[] { Convert.ToInt32(e.NewValue) };
                this.Context.Refresh();
            }
        }
    }
}
